<!doctype html>
<html>
<head>
<meta charset='UTF-8'><meta name='viewport' content='width=device-width initial-scale=1'>
<title>Readme</title>
</head>
<body><h1 id='imagetools'>ImageTools</h1>
<ul>
<li><em>作者：<a href='https://www.qinxing.xyz/'>李钦星</a></em> </li>
<li><em>版本：1.4</em> </li>

</ul>
<p>这是一款图像相关的工具软件，扩展性好。目前集成有镜头计算器、抖动测试工具、看图工具等功能。可以方便的进行后期算法的验证（热更新、直观的图像显示和分析）。退出后会自动保存上次打开的窗口，以及窗口里的参数。</p>
<p>目前涉及到的算法：镜头景深计算，图像抖动程度的量化，数字水印，ISP算法（黑电平，坏点矫正，暗影矫正，去马赛克，白平衡，色彩校正，gamma，局部对比度增强，色度空间转换，对比度亮度调整，小波降噪WNR，锐化）</p>
<hr />
<h2 id='目录'>目录</h2>
<ul>
<li><p><a href='#imagetools'>ImageTools</a></p>
<ul>
<li><p><a href='#目录'>目录</a></p>
</li>
<li><p><a href='#一-镜头计算器'>一. 镜头计算器</a></p>
<ul>
<li><p><a href='#主要功能'>主要功能</a></p>
<ul>
<li><a href='#1-景深计算'>1. 景深计算</a></li>
<li><a href='#2-镜头参数输出'>2. 镜头参数输出</a></li>

</ul>
</li>
<li><p><a href='#计算原理'>计算原理</a></p>
</li>

</ul>
</li>
<li><p><a href='#二-防抖检测工具'>二. 防抖检测工具</a></p>
<ul>
<li><a href='#1-使用方法'>1. 使用方法</a></li>
<li><a href='#2-高级操作'>2. 高级操作</a></li>
<li><a href='#3-评价标准'>3. 评价标准</a></li>

</ul>
</li>
<li><p><a href='#三-图片查看工具'>三. 图片查看工具</a></p>
<ul>
<li><p><a href='#界面'>界面</a></p>
</li>
<li><p><a href='#使用方法'>使用方法</a></p>
</li>
<li><p><a href='#拓展功能'>拓展功能</a></p>
<ul>
<li><a href='#数字水印'>数字水印</a></li>

</ul>
</li>

</ul>
</li>
<li><p><a href='#四-raw图编辑工具'>四. RAW图编辑工具</a></p>
<ul>
<li><a href='#界面-1'>界面</a></li>
<li><a href='#使用方法-1'>使用方法</a></li>
<li><a href='#参数设置'>参数设置</a></li>
<li><a href='#目前进展'>目前进展</a></li>

</ul>
</li>
<li><p><a href='#五-视频对比工具'>五. 视频对比工具</a></p>
<ul>
<li><a href='#界面-2'>界面</a></li>
<li><a href='#使用方法-2'>使用方法</a></li>

</ul>
</li>
<li><p><a href='#六-pqtools转代码工具'>六. PQtools转代码工具</a></p>
<ul>
<li><a href='#背景'>背景</a></li>
<li><a href='#使用方法-3'>使用方法</a></li>
<li><a href='#基础设置'>基础设置</a></li>
<li><a href='#自定义设置可以用默认的或者自定义'>自定义设置（可以用默认的，或者自定义）</a></li>

</ul>
</li>
<li><p><a href='#七-代码拓展与编译'>七. 代码拓展与编译</a></p>
<ul>
<li><p><a href='#1-扩展方法'>1. 扩展方法</a></p>
</li>
<li><p><a href='#2-vscode配置方法'>2. vscode配置方法</a></p>
<ul>
<li><a href='#安装依赖'>安装依赖</a></li>
<li><a href='#ui修改'>UI修改</a></li>

</ul>
</li>
<li><p><a href='#3-打包方法'>3. 打包方法</a></p>
</li>

</ul>
</li>

</ul>
</li>

</ul>
<hr />
<h2 id='一-镜头计算器'>一. 镜头计算器</h2>
<h3 id='主要功能'>主要功能 </h3>
<h4 id='1-景深计算'>1. 景深计算</h4>
<ol start='' >
<li><p>图像<strong>输出</strong>选择景深</p>
</li>
<li><p>可以选择的<strong>变量</strong>有三种，焦距、光圈和物距，物距就是镜头的对焦距离，这个决定了左侧图像X轴的意义</p>
</li>
<li><p><strong>基础设置</strong>：设置镜头的焦距，光圈，物体对焦距离和sensor尺寸，这四个参数必须准确</p>
</li>
<li><p>高级设置—<strong>sensor尺寸</strong>：由于sensor尺寸用英寸表示，并不准确，这里提供sensor尺寸的微调。</p>
</li>
<li><p>高级设置—<strong>弥散圈直径</strong>：景深就是图像清晰的范围，而弥散圈就是衡量图像清晰的标准。滑块往左拖，弥散圈越小，那么清晰度的标准就越高，景深对应也会越小。</p>
</li>
<li><p><strong>高级设置</strong>：焦距、光圈、对焦范围，是用来调节图像X轴的范围</p>
</li>
<li><p>最后点击<strong>确认</strong>就会输出想要的图像</p>
</li>
<li><p>图像下方有对图像微调的<strong>按钮</strong></p>
<p>从左到右的功能分别是还原图像，回退上一步，前进一步，移动图像，图像局部放大，调整图像坐标轴的范围，调整图像坐标轴的名称，另存图像</p>
</li>

</ol>
<h4 id='2-镜头参数输出'>2. 镜头参数输出 </h4>
<ol start='' >
<li>图像输出选择参数</li>
<li>其余步骤参考景深计算一致</li>
<li>等效焦距：sensor对角线的长度，等效成35mm照相机画幅对角线长度（42.27mm）时，其镜头的实际焦距所对应的35mm照相机镜头的焦距。</li>
<li>超焦距距离：对焦距离越近，前景深越近。而对焦在远处的某一点，使得景深的另一极端恰为”无限远“，此时对焦距离就称作超焦距距离。相机对焦在超焦距距离，可以让景深最大</li>
<li>前景深距离：当前配置下，能看清的最近距离</li>
<li>后景深距离：当前配置下，能看清的最远距离</li>
<li>总景深：当前配置下，清晰的范围</li>

</ol>
<h3 id='计算原理'>计算原理</h3>
<p>本文用的方法来自此<a href='https://wenku.baidu.com/view/2191302baf45b307e9719706.html'>论文</a></p>
<hr />
<h2 id='二-防抖检测工具'>二. 防抖检测工具</h2>
<p>这是一款用来量化防抖效果的工具。</p>
<h3 id='1-使用方法'>1. 使用方法</h3>
<ol start='' >
<li>拍摄视频，视频的要求：尽量用棋盘格等边缘比较明显的物体，图像中心尽量有明显的特征点</li>
<li>导入振动台上拍摄的视频，可以通过打开文件或者拖动文件到视频预览窗口进行导入</li>
<li>也可以对设备进行在线调试：点击打开设备，然后配置rtsp的用户，密码，IP和端口号。如果是移动执法仪设备的话，只需要确保adb或者kdb能够连接设备，默认设置即可。</li>
<li>点击右下角的开始，会开始对图像进行处理，并会更新实时的结果。点击停止，会停止图像的处理</li>
<li>视频预览会显示每个特征点的运动轨迹，中心的特征点会着重标注出来。确保每个点的轨迹都没有问题。在最终结果那一栏会得出这段时间内的最终结果</li>

</ol>
<h3 id='2-高级操作'>2. 高级操作</h3>
<ol start='' >
<li>ROI上下边界：由于有些视频存在OSD，会干扰到特征点的选取，可以调整上下边界控制特征点的选取范围</li>
<li>跳过帧数：因为有的时候前几帧有干扰的物体，或者效果不佳，可以跳过前几帧，再进行特征点选取。</li>
<li>特征点的数量：如果画面中心没有特征点，那么可以调整此滑块。如果特征点过多，也可以调整此滑块</li>
<li>特征点的运动幅度：如果运动幅度过大，出现跟踪错误的话，就增大特征点的运动幅度</li>
<li>计算间隔（帧）：每多少帧会输出一个实时的结果，确保每次的实时结果都比较正常，再去看最终结果</li>
<li>计算方向：跟最后结果挂钩，只显示某个方向上的结果</li>
<li>去除静止的特征点：可以排除roi等静止的点，优先选用ROI的方式</li>

</ol>
<h3 id='3-评价标准'>3. 评价标准</h3>
<ul>
<li>中心点位移：一段时间内离图像中心最近的特征点的最大像素点位移</li>
<li>各点最大位移：检测到的所有特征点中，最大的像素点位移</li>
<li>图片扭曲程度：根据所有的特征点的运动轨迹，与中心的差距，算出一个图片的变形程度</li>
<li>实时结果是每50帧计算一次，最终结果根据实时结果进行平均或者更新</li>

</ul>
<hr />
<h2 id='三-图片查看工具'>三. 图片查看工具</h2>
<p>这是一款能够对图像进行分析以及简单的处理工具</p>
<h3 id='界面-1'>界面</h3>
<ol start='' >
<li>右侧有四个按钮，分为为：打开图像，保存图像，图像处理前后对比，图像统计分析</li>
<li>菜单栏有各种图像处理的模块，目前仅仅做了滤波的相关处理</li>
<li>左下角会显示当前图像鼠标位置像素点的信息，包括RGB值以及缩放比例</li>

</ol>
<h3 id='使用方法-1'>使用方法</h3>
<ol start='' >
<li>可以通过点击打开图像的按钮或者拖动图片到图像显示框里进行显示</li>
<li>通过菜单栏可以对图像进行简单的处理</li>
<li>通过保存按钮可以保存当前的图像(可是是图像处理前后的)</li>
<li>通过对比按钮可以对比图像处理前后的变化</li>
<li>通过点击图像统计分析按钮可以获取到整幅图像的统计信息，包括直方图，RGB均值与信噪比，转成YUV之后的均值和信噪比，窗口大小，以及RGB增益</li>
<li>统计信息窗口不关闭的情况下，框选图像中的任意一块区域，都可以显示这块区域的统计信息</li>
<li>统计信息窗口中的直方图，显示了RGB和Y通道的直方图，可以通过复选框选择是否显示该通道的直方图</li>

</ol>
<h3 id='拓展功能'>拓展功能</h3>
<h4 id='数字水印'>数字水印</h4>
<p>位置：工具-&gt;水印</p>
<ol start='' >
<li>导入水印图片</li>
<li>选择水印类型：半透明水印（可以看到）、空域隐形水印（看不到）</li>
<li>如果是半透明水印，可以调整水印大小和水印的透明度</li>
<li>如果是空域隐形水印，可以调整水印的大小和二值化的阈值</li>
<li>点击<code>制作带水印的图片</code>，可以制作出最后带水印的图片。在点击这个按钮之前显示的都是预览效果</li>
<li>点击<code>解析空域隐形水印</code>，可以解析出由本软件制作出来的空域水印。这个功能是独立的，并非需要先制作水印才能解析。</li>

</ol>
<hr />
<h2 id='四-raw图编辑工具'>四. RAW图编辑工具</h2>
<p>这是一款能够对RAW图进行解析和ISP处理的工具。可以方便的进行后期算法的验证（热更新、直观的图像显示和分析）。退出后会自动保存上次打开的窗口，以及窗口里的参数。同时将界面与处理线程分离，让界面更加流畅。</p>
<h3 id='界面-2'>界面</h3>
<ol start='' >
<li>左侧是图像预览窗口</li>
<li>右上角有两个窗口，左边的是RAW图的设置，右边的是ISP处理流程</li>
<li>右下角是对ISP处理的一些配置</li>

</ol>
<h3 id='使用方法-2'>使用方法</h3>
<ol start='' >
<li><strong>导入raw图</strong>：先进行RAW图的设置，然后可以点击“打开图片”或者拖拽的方式打开图片，此时图片预览窗口显示的是RAW图，可以用鼠标进行放大缩小和移动，窗口的左下角会显示每个点的值，以及缩放比例</li>
<li><strong>ISP pipeline设置</strong>：可以通过<code>勾选</code>的方式去启用部分ISP流程，通过<code>拖拽</code>的方式去调整ISP的顺序，然后点击确定按钮，可以进行ISP的处理，右下角的进度条可以显示ISP处理的进度。</li>
<li><strong>ISP 参数设置</strong>：右下角的ISP参数设置窗口，修改参数后，也需要点击确定按钮，运行ISP。第二步和第三步ISP的处理，会对比之前的ISP流程，自动搜索最少的处理流程。右下角有处理的进度条以及耗时显示。</li>
<li><strong>过程中的图片查看</strong>：<code>双击</code>ISP处理流程中的模块，可以看到经过这个模块的处理，图片变成了什么效果。此功能可以方便的看到每个ISP模块的效果。</li>
<li><strong>图片分析</strong>：图片查看时点击<code>图片分析</code>按钮，会立刻显示全局的直方图统计，图片大小，平均值等信息。此时鼠标变成了选框模式，只要选中图片中的某一区域，就会显示这个区域的直方图信息，信噪比，平均值，RGB比值等信息，直方图可以挑选YRGB中的任意通道进行显示。</li>
<li><strong>算法调试</strong>：如果需要进行算法的调试，修改相关ISP算法代码之后，点击<code>算法热更新</code>，可以重新加载ISP相关算法，不需要重新启动程序。如果报错，弹出的窗口会显示错误信息。</li>

</ol>
<h3 id='参数设置'>参数设置</h3>
<ol start='' >
<li><p>图片格式：RAW图的宽，高，bit位数，格式和pattern，目前仅支持海思的raw图格式</p>
</li>
<li><p>ISP处理流程：ISP处理分为三个区域，绿色的是raw域的处理，黄色的是RGB域的处理，蓝色的是yuv域的处理。可以通过勾选的方式去启用部分ISP流程，通过拖拽的方式去调整ISP的顺序，但是调整不要超过自己的区域，如raw域的处理不能放在yuv域进行处理。</p>
</li>
<li><p>黑电平：每个通道的黑电平</p>
</li>
<li><p>坏点检测：调整检测的区域</p>
</li>
<li><p>rolloff：暗影矫正
导入拍摄均匀光照的raw图，格式要一样</p>
</li>
<li><p>demosaic：去马赛克
有三种模式：双线性插值、malver、menon实现</p>
</li>
<li><p>awb: 白平衡
填入RGB的增益，也可以点击<code>从raw图选取</code>的按钮，然后用鼠标在图中选中一块灰色的区域即可，注意用来选取白平衡的图，需要是在黑电平处理过后的raw图</p>
</li>
<li><p>ccm: 3x3色彩校正矩阵</p>
</li>
<li><p>gamma：gamma值</p>
</li>
<li><p>LTM：局部对比度增强</p>
<ol start='' >
<li>暗区提升：提升暗区亮度</li>
<li>亮度抑制：抑制亮度亮度</li>

</ol>
</li>
<li><p>CSC：色度空间转换RGB-&gt;YUV</p>
<ol start='' >
<li>是否限制YUV输出范围：TV标准中亮度的范围是16-235，PC标准是0-255，如果选中，就是采用TV标准，对比度会低一些</li>
<li>色域标准：BT709，BT2020, BT601三种可选</li>
<li>亮度、对比度、色调、饱和度调整</li>

</ol>
</li>
<li><p>yuv denoise: 在三种频率上分别进行小波降噪</p>
<ol start='' >
<li>降噪强度：双边滤波的强度，值越大，降噪强度越大</li>
<li>噪声阈值：值越大，选取的噪声范围越大</li>
<li>降噪权重：值越大，降噪越强，值为0的时候，就不进行降噪</li>
<li>色度降噪强度：值越大，颜色降噪越强</li>

</ol>
</li>
<li><p>yuv sharpen: 基于方向检测的锐化</p>
<ol start='' >
<li>3x3中值滤波强度：在锐化强进行一次中值滤波，值越大，滤波越强，值为0，就是没有进行中值滤波</li>
<li>锐化强度：值越大，锐化强度越大</li>
<li>锐化钳位阈值：控制锐化上限，避免出现白边，值越小，锐化上限越低</li>
<li>降噪阈值：小于这个范围的细节进行降噪，大于这个范围的细节进行锐化，值越大，降噪的范围越多</li>

</ol>
</li>

</ol>
<h3 id='目前进展'>目前进展</h3>
<p>目前实现了黑电平，坏点矫正，暗影矫正，去马赛克，白平衡，色彩校正，gamma，局部对比度增强，色度空间转换，对比度亮度调整，小波降噪WNR，锐化等算法</p>
<hr />
<h2 id='五-视频对比工具'>五. 视频对比工具</h2>
<p>这是一款能够对比多个视频的工具，可以很容易的实现对多个视频进行同步播放和对比</p>
<h3 id='界面-3'>界面</h3>
<ol start='' >
<li>右侧是工具栏，上面有不同颜色的三组按钮</li>
<li>左侧是视频预览窗口</li>

</ol>
<h3 id='使用方法-3'>使用方法</h3>
<ol start='' >
<li>每个视频预览窗口可以通过拖拽的方式把视频拖进来，也可以点击下方的打开文件的方式打开本地文件。</li>
<li>还支持设备rtsp码流的播放，点击打开设备之后，可以对设备进行在线调试：点击打开设备，然后配置rtsp的用户，密码，IP和端口号。如果是移动执法仪设备的话，只需要确保adb或者kdb能够连接设备，默认设置即可。</li>
<li>每个视频都可以设置不同的跳过帧数，以实现不同视频之间的一个同步</li>
<li>第一组的三个按钮是对所有视频的播放进行控制，分别是开始，暂停和重新开始</li>
<li>第二组的两个按钮是对视频预览的窗口数量进行控制，分别是增加一个视频窗口，减少一个视频窗口</li>
<li>第三组的两个按钮是对所有视频的播放速度进行控制，分别是加速和减速，播放速度在窗口的左下角进行显示</li>

</ol>
<hr />
<h2 id='六-pqtools转代码工具'>六. PQtools转代码工具</h2>
<h3 id='背景'>背景</h3>
<p>pqtools调试生成的参数太多，如果直接写到代码里，一来参数需要一个个的修改，非常麻烦，二来容易出现超大函数，魔鬼数字等cleancode报错，三是代码逻辑混乱，条理不清晰。这个pqtools转代码的工具就应运而生了，可以直接将pqtools保存的xml文件生成头文件，只需要在c文件中把参数包含进行即可。</p>
<h3 id='使用方法-4'>使用方法</h3>
<p>设置完毕后，点击生成，当进度条到了100%的时候，就生成完毕。在输出文件的路径下会自动生成头文件，也可以直接复制左侧预览窗口生成的文本。</p>
<h3 id='基础设置'>基础设置</h3>
<ol start='' >
<li><strong>输入设置</strong>：将pqtools调试的参数另存为xml文件。点击<code>打开xml文件</code>按钮，设置成需要转换的pqtools参数文件。</li>
<li><strong>输出设置</strong>：点击输出文件路径，设置转换后的头文件路径</li>

</ol>
<h3 id='自定义设置可以用默认的或者自定义）'>自定义设置（可以用默认的，或者自定义）</h3>
<ol start='' >
<li><strong>缩进的空格数</strong>：可以控制代码的缩进，默认为4个空格</li>
<li><strong>设置一行最大字符数</strong>：到了一定的字数会自动换行，默认是一行120个字符</li>
<li><strong>产品ID</strong>：可以自定义产品名称，该名称会自动加在结构体参数名字中</li>
<li><strong>需要去除的元素</strong>：默认是<code>rb</code>，pqtools生成的文件中有部分元素和代码中的结构体定义对不上，需要去除这部分元素</li>
<li><strong>需要输出的结构体</strong>：pqtools生成的xml文件里包含了所有的参数，参数太多了，其中有很多用不到的，这就需要进行一个删减和过滤，把需要输出的结构体列举出来，一行一个。例如<code>hiISP_SHARPEN_ATTR_S</code></li>
<li><strong>需要包含的头文件</strong>：自定义该头文件需要包含哪些头文件，一般用默认就好</li>
<li><strong>自定义结构体</strong>：可以用来解决结构体里面含有指针的问题，含有指针的结构体不好直接通过赋值初始化，需要先转换成数组，然后把数组转换成指针。默认提供了3DNR的自定义结构体<code>customNRX_PARAM_AUTO_V1_S</code></li>
<li><strong>需要替换的结构体</strong>：可以把原生的结构体替换成自定义的结构体，一般与上面联用。由于3DNR的参数带有指针，不能通过赋值直接初始化，默认会把3DNR的参数先替换成自定义的结构体，然后对自定义结构体进行赋值初始化，最后c文件就使用自定义结构体，来代替原来的3DNR结构体。默认:<code>hiNRX_PARAM_AUTO_V1_S:customNRX_PARAM_AUTO_V1_S</code></li>
<li><strong>版权声明</strong>：定义头文件起始的版权说明，宏定义<code>%AUTHOR%</code>会自动转换成作者名，<code>%NOW_TINE%</code>会自动转换成当前时间</li>
<li><strong>是否需要加const</strong>：可以选择生成的结构体变量前面是否const，如果加了const就是常量了，不能修改其中的值了。</li>

</ol>
<hr />
<h2 id='七-代码拓展与编译'>七. 代码拓展与编译</h2>
<h3 id='1-扩展方法'>1. 扩展方法</h3>
<ol start='' >
<li>tools类中增加工具的使用方式和界面，可以直接继承SubWindow类，参考pqtools_to_code.py</li>
<li>ImageTools.py中添加工具的打开方式</li>
<li>如果需要添加图标等资源，就加在Ui的resource文件夹里，并配置resource.qrc</li>

</ol>
<h3 id='2-vscode配置方法'>2. vscode配置方法</h3>
<h4 id='安装依赖'>安装依赖</h4>
<p><code>pip install -r requirements.txt</code></p>
<h4 id='ui修改'>UI修改</h4>
<ol start='' >
<li>安装python for QT插件</li>
<li>在设置里面填写designer.exe的路径和pyuic的路径，然后右键ui文件，就可以对文件进行修改或者编译啦。</li>
<li>如果想要在当前目录下生成，修改pyuic的配置为：<code>pyside2-uic -o ${fileDirname}/${fileBasenameNoExtension}.py</code></li>
<li>修改pyside2-rcc的资源配置： <code>pyside2-rcc -o ./resource_rc.py</code></li>

</ol>
<h3 id='3-打包方法'>3. 打包方法</h3>
<p>运行buildexe.bat, 注意需要安装打包库<code>pyinstaller</code>和打包软件<code>inno setup compiler</code></p>
</body>
</html>